#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QMessageBox>
#include <QElapsedTimer>
#include <QPixmap>      // 截图功能依赖
#include <QScreen>      // 截图功能依赖
#include <QDir>         // 目录创建依赖
#include <QRandomGenerator>  // 随机截图间隔生成依赖
#include <windows.h>
#include <psapi.h>
#include <map>
#include <string>
#include <QString>      // 新增：用于组合键字符串
#include <iostream>

using namespace std;

// 定义截图保存根路径（与.cpp文件一致，便于统一维护）
#define SCREENSHOT_ROOT_PATH "E:\\project_jietu"
// 随机截图最小间隔（10分钟 = 600000毫秒）
#define MIN_RANDOM_SCREENSHOT_INTERVAL 600000
// 随机截图最大间隔（30分钟 = 1800000毫秒）
#define MAX_RANDOM_SCREENSHOT_INTERVAL 1800000

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void checkTimeout();                  // 检查窗口超时
    void handleWindowChange(HWND newHWND); // 处理窗口切换逻辑（鼠标/键盘切换统一调用）
    void on_pushButton_start_clicked();   // 启动监控按钮点击事件
    void on_pushButton_end_clicked();     // 停止监控按钮点击事件
    void takeRandomScreenshot();          // 随机截图触发（定时器绑定槽函数）

private:
    // UI相关
    Ui::MainWindow *ui;

    // 系统钩子与窗口监控相关
    HHOOK m_hook;                         // 鼠标钩子句柄
    HHOOK m_keyboardHook;                 // 键盘钩子句柄（监听键盘操作）
    HWND m_lastHWND;                      // 上一个激活的窗口句柄
    QTimer *m_timer;                      // 超时检查定时器
    int m_timeout;                        // 超时阈值（毫秒）
    bool m_isRunning;                     // 监控状态标志（true=运行中）
    qint64 m_lastActivityTime;            // 最后活动时间戳（判断超时用）

    // 计时相关
    QElapsedTimer *m_windowElapsedTimer;  // 窗口运行高分辨率计时器
    qint64 m_lastTime;                    // 兼容旧逻辑的时间戳（已弃用）

    // 数据映射缓存（核心修改：截图状态映射表的键改为QString，存储"窗口句柄|场景"组合）
    map<HWND, qint64> m_totalTimeMap;        // 窗口句柄到总运行时间的映射
    map<HWND, std::string> m_processPathMap; // 窗口句柄到进程路径的映射
    map<DWORD, QString> m_processNameMap;    // 进程ID到进程名的映射
    map<QString, bool> m_screenshotRecordMap; // 窗口切换截图状态（键："HWND|window_switch"）
    map<QString, bool> m_timeoutScreenshotMap; // 超时截图状态（键："HWND|timeout"）

    // 截图相关
    QTimer *m_randomScreenshotTimer;      // 随机截图定时器
    int m_randomScreenshotInterval;       // 随机截图时间间隔（毫秒）
    qint64 m_lastRandomScreenshot;        // 上次随机截图时间戳（预留扩展）

    // 钩子回调函数（必须静态）
    static LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);  // 鼠标钩子回调
    static LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam); // 键盘钩子回调

    // 核心功能函数
    bool setMouseHook();                  // 设置鼠标钩子
    bool setKeyboardHook();               // 设置键盘钩子
    void unsetMouseHook();                // 移除鼠标钩子
    void unsetKeyboardHook();             // 移除键盘钩子
    void updateTimeout();                 // 更新超时时间戳
    void logInfo(const QString &info);    // 日志输出函数
    void takeScreenshot(const QString &prefix); // 截图核心函数

    // 辅助工具函数
    QString getWindowTitle(HWND hWnd);    // 获取窗口标题
    QString getProcessName(DWORD processId); // 获取进程名称
    std::string getProcessPath(HWND hWnd); // 获取进程路径
};

#endif // MAINWINDOW_H
